﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once
#include <string>
#include <map>

namespace gcmp
{
    class IJournalUiObject;
    class IJournalUiEvent;

    /// \brief 日志Ui录制者，派生并通过IJournalUiRecorderAndReplayerCreator注册到日志中可以定制Ui录制行为
    ///
    /// Ui录制是指对指定的控件事件进行解析，得到需要记录到脚本中的信息，并记录到脚本中
    /// 记录到脚本由框架负责执行
    class IJournalUiRecorder
    {
    public:
        /// \brief 析构函数
        virtual ~IJournalUiRecorder() {}

        /// \brief 录制，对指定的控件事件进行解析，得到需要记录到脚本中的信息
        ///
        /// 由框架进行调用，调用时机由IJournalUiRecorderAndReplayerCreator控制，详情见IJournalUiRecorderAndReplayerCreator
        /// 建议不要依赖于Ui的坐标信息，录制和回放时的坐标系可能会有差别，比如在分辨率不同的机器上，Ui界面会有所差别，分辨率小的机器由于无法显示完所有内容会有滚动条等
        /// 建议不要依赖受排列顺序影响的索引，比如表格的行列，tabWidget的tab索引，Element的id等，这种信息容易变动，维护起来代价大
        /// \param[in] pIUiObject 需要录制的Ui层控件数据
        /// \param[in] pIUiEvent 需要录制的Ui层事件数据
        /// \param[out] eventType 解析得到的事件类型
        /// \param[out] journalParameter 解析得到的日志参数
        /// \param[out] filterEvent 该事件是否需要被过滤掉，使其不触发
        /// \return 运行结果，true:成功;false:失败
        virtual bool Record(IJournalUiObject *pIUiObject, IJournalUiEvent *pIUiEvent, std::wstring &eventType, std::map<std::wstring, std::wstring> &pJournalParameter, bool &filterEvent) = 0;
    };
}


